package com.example.hang.msgqueue;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.widget.TextView;

/**
 * 在UI线程处理后台线程发来的消息
 */
public class HandlerUiMsgActivity extends AppCompatActivity {

    /**
     * 用来显示收到的消息数据
     */
    TextView tvNum;

    /**
     * 用来处理消息的对象
     */
    Handler uiMsgHandler;

    /**
     * 重写Activity的onCreate方法
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler_ui_msg);
        //获取TextView
        tvNum = (TextView)findViewById(R.id.tvNum);
        //构造消息处理对象
        uiMsgHandler = new UiMsgHandler();
        //开启后台线程，向UI线程发消息
        new NetDataThread().start();
    }

    /**
     *  UI 线程消息处理类，继承Handler类
     */
    class UiMsgHandler extends Handler{
        /**
         * 当收到消息时，消息循环就会调用该方法来处理消息
         * @param msg 收到的消息
         */
        @Override
        public void handleMessage(Message msg){
            //判断消息类型
            if(msg.what == 0x123){
                //获取消息中附带的数据
                int data = msg.getData().getInt("data");
                //在TextView中显示收到的数据
                tvNum.append(" " + Integer.toString(data));
            }
        }
    }

    /**
     * 模拟获取网路数据的线程类
     */
    class NetDataThread extends Thread{
        /**
         * 后台线程，模拟获取网络数据
         */
        @Override
        public void run(){
            try{
                for(int i = 0; i < 100; i++){
                    //构造要发到UI线程的消息
                    Message msg  = new Message();
                    //消息类型，用于区分消息
                    msg.what = 0x123;
                    Bundle bundle = new Bundle();
                    bundle.putInt("data",i);
                    //往消息中附加额外的数据
                    msg.setData(bundle);
                    //向UI线程发消息，表示收到数据
                    uiMsgHandler.sendMessage(msg);
                    //暂停，模拟取网络数据
                    Thread.sleep(500);
                }
            }catch (InterruptedException e){
                //
            }
        }
    }
}
